// Copyright (c) 2010 Manuel Peinado Gallego <manuel.peinado@gmail.com>
// Distributed under the MIT license

#include "stdafx.h"
#include "WorldBuilder.h"
#include "Transformable.h"

// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Transformable::Transformable()
: m_localTransform(gx::eye)
{
}

// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

void Transformable::setLocalTransform(const gx::Mat4 & m) 
{
    m_localTransform = m;
}


// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

void Transformable::scaleLocal(double s)
{
    setLocalTransform(
        gx::Mat4().make_scale(s) * getLocalTransform());
}

void Transformable::scaleLocal(const gx::Vec3 & s)
{
    setLocalTransform(
        gx::Mat4().make_scale(s) * getLocalTransform());
}

void Transformable::moveLocal(const gx::Vec3 & delta)
{
    // Optimize this, we don't need most of the scalar multiplications
    setLocalTransform(gx::Mat4().make_transl(delta) * getLocalTransform());
}
    
void Transformable::rotateLocal(const gx::AxisAngle & aa)
{
    setLocalTransform(
        gx::Mat3().make_rot(aa) * getLocalTransform());
}

// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
